import pymysql
from pymysql import OperationalError,ProgrammingError,InternalError
import traceback,re
'''为了解决 一个表中 多个键的唯一性
需要使用 unique（）方法来设置多个键的唯一
注意 使用 unique（）方法设置的key 不是该表的主键
MySQL 中没有多个主键，只有主键、外键、组合键、索引
不能同时存在多个独立的 PRIMARY KEY，但是 可以有多个 unique
使用unique（）语句来确保指定key的唯一性，同时也保证了 主键的唯一性
'''
config = {
    'host': '127.0.0.1',
    'port': 3306,
    'user': 'root',
    'passwd': '123456',
    'db': 'workdb',
    'charset': 'utf8'
}

import json
def rows():
    li=[]
    with open('./in_theaters.json','r') as f:
        load = json.load(f)
    for i in load["subjects"]:
        lie1=[]
        str = ','.join(i["genres"])
        for m in i["casts"]:
            lie1.append(m["name"])
        str1=','.join(lie1)
        str2=','.join(i["durations"])
        str3= ','.join(i["pubdates"])
        lie2 = []
        lie2.extend([i["title"], i["rating"]["average"],str,str1,str2,i["directors"][0]["name"],str3])
        li.append(lie2)
    return li

def connect_db():
    try:
        connect = pymysql.connect(**config)
        return connect
    except OperationalError as e:
        print(e)


def query_insert_one(table_name, data,li):
    insert_data = [
        ('mid', None),
        ('title', 'li[0]'),
        ('average',li[1]),
        ('genres',li[2]),
        ('casts',li[3]),
        ('durations',li[4]),
        ('directors',li[5]),
        ('pubdates',li[6])
    ]
    head = []
    values = []
    temps = []
    for item in insert_data:
        head.append(item[0])
        values.append(item[1])
        temps.append('%s')
    '''将 List 转换成 tuple 元组数据集合'''
    head = tuple(head)
    values = tuple(values)
    temps = tuple(temps)
    '''拼接 数据库执行语句 字符串'''
    base_url = "insert into "
    base_url += table_name + str(head) +'values'+str(temps)
    '''利用正则 去掉  ' 单引号'''
    base_url = re.sub(r'\'','',base_url)
    connect = connect_db()
    if connect:
        cursor = connect.cursor(cursor=pymysql.cursors.DictCursor)
        try:
            '''使用 execute() 方法执行SQL语句 防注入'''
            cursor.execute(base_url,values)
            '''提交修改数据 并保存'''
            connect.commit()
        except:
            traceback.print_exc()
            connect.rollback()
        finally:
            cursor.close()
            connect.close()


def query_find_all(table_name):
    if table_name is None:
        return '****************'
    sql_string = "select * from " + table_name
    print(sql_string)
    connect = connect_db()
    if connect:
        cursor = connect.cursor(cursor=pymysql.cursors.DictCursor)
        try:
            cursor.execute(sql_string)
            return cursor.fetchall()
        except ProgrammingError as e:
            print(e)
            connect.rollback()
        finally:
            cursor.close()
            connect.close()
    else:
        return None


def main():
    # li1=rows()
    # for li in li1:
    #     print(li)
    #     query_insert_one('moves','',li)


    print(query_find_all('moves'))

if __name__ == '__main__':
    main()




